package ru.pb.game.network.engine.client.packets.sendable;

import gnu.trove.map.TIntObjectMap;
import ru.pb.game.configs.GameNetworkConfig;
import ru.pb.game.data.xml.holders.ChannelHolder;
import ru.pb.game.network.engine.client.packets.GameServerToClientPacket;
import ru.pb.game.objects.model.CHANNEL;
import ru.pb.global.network.utils.NetworkUtil;

/**
 * // [6:32:39] Vadim: 4 байта
 * // [6:32:39] Vadim: 4 байта
 * // [6:32:44] Vadim: 2 байта
 * // [6:32:50] Vadim: 2 байта
 * // [6:32:57] Vadim: 10 байт
 * // [6:33:04] Vadim: 1 байт
 * // [6:33:17] Vadim: 4 байта с количеством циклов
 * // [6:33:29] Vadim: Цикл из 17 байтов
 * // [6:33:36] Vadim: И колва ранее прочитаного
 * // [6:33:50] Vadim: Далее
 * // [6:34:01] Vadim: 2 байта сколичеством второго цикла
 * // [6:34:01] Vadim: Цикл второй состоит из чтения 2 байта 4 байта 4 байта
 * // [6:34:01] Vadim: Читаем 1 байт в котором количкство еще одного цикла
 * // [6:34:01] Vadim: Далее чтение цикла кусками по 12 байт
 * // [6:34:01] Vadim: Причем в этом цикле в этих 12 байтах идет тип чегото
 * // [6:34:01] Vadim:
 * 
 * @author Felixx
 */
public class PROTOCOL_BASE_GET_CHANNELLIST_ACK extends GameServerToClientPacket
{
	private TIntObjectMap<CHANNEL> _channels;

	public PROTOCOL_BASE_GET_CHANNELLIST_ACK()
	{
		_channels = ChannelHolder.getAllChannels();
	}

	@Override
	public void writeImpl()
	{
		writeH(2049); // опкод
		writeD(_client.getId()); // ID Клиента
		writeB(_client.getIPBytes()); // 74.115.1.94
		writeH(_client.getCryptKey()); // Ключ шифрования
		writeH(_client.hashCode()); // Хз нах, но пусть будет

		// Каналы
		for(int i = 0; i < 10; i++)
		{
			writeC(_channels.get(i).getType());
		}

		writeC(1); // ХЗ постоянное, Количество ЛС?)

		int count1 = 1; // Кол-во серверов
		writeD(count1 + 1);

		writeD(1); // Доступность ЛС?
		writeB(NetworkUtil.parseIpToBytes(GameNetworkConfig.AUTH_SERVER_HOST)); // айпи аутха
		writeH(GameNetworkConfig.AUTH_SERVER_PORT); // Порт аутха
		writeC(1); // Тип
		writeH(4000); // Максимально персов на сервере 4000
		writeD(); // заполненность!

		for(int i = 0; i < count1; i++)
		{
			writeB(new byte[17]); // Попробуем не посылать. ибо нах оно тут?
		}

		int count2 = 0; // ХЗ небыло пока > 0
		writeH(count2);
		for(int i = 0; i < count2; i++)
		{
			writeH();
			writeD();
			writeD();
		}

		int count3 = 2;
		writeC(count3); // ХЗ на руоффе тут 2
		for(int i = 0; i < count3; i++)
		{
			writeB(new byte[12]); // Всегда в конце нули. Руофф.
		}
	}
}